#ifndef MYGRAPH_H
#define MYGRAPH_H
#include <QString>
#include <QList>
#include <QFile>
#include <QTime>
#include "package.h"
#define MAXPOINTNUM 500
#define infinite 2000.

struct pointMessage
{
    /**
     * @brief pointName     地点名称（多个服务设施使用/区分）
     */
    QList<QString>  pointName;

    /**
     * @brief pointX       地点在地图上的x坐标
     */
    int pointX;

    /**
     * @brief pointY       地点在地图上的y坐标
     */
    int pointY;

    /**
     * @brief pointCampus   地点所属的校区
     * 0-西土城校区   1-沙河校区
     */
    int pointCampus;

    /**
     * @brief pointType     地点所属类型
     * 0-路口，1-建筑
     */
    int pointType;
};

struct arcMessage
{
    /**
     * @brief prePoint      保存两点间最短路线中途径的所有点（包含终点，但不包含起点）
     */
    QList<int> prePoint;
    /**
     * @brief distance      两点间距离，单位：米
     */
    double distance = infinite;
    /**
     * @brief bikePass  该路段自行车是否可以通行
     */
    bool bikePass = false;
    /**
     * @brief congest   该路段的拥挤度，可直接用于计算。
     * 数值大于等于1(初始化为1)
     * 表示通行该路段消耗的时间为完全畅通时的多少倍
     */
    double congest = 1;

    /**
     * @brief peakPeriod    该路段的峰期（单位：分钟）
     * 表示方式为： 小时 * 60 + 分钟
     */
    QList<int> peakPeriod;

    /**
     * @brief peakValue     该路段在峰期的拥挤度峰值
     * 数值大于等于1(初始化为1)
     * 表示通行该路段消耗的时间为完全畅通时的多少倍
     */
    QList<double> peakValue;
};

class myGraph
{
public:
    package *pkg;

    /**
     * @brief point     存储地点名称，位置以及所属类型等信息
     */
    struct pointMessage point[MAXPOINTNUM];

    /**
     * @brief arc   存储路段距离，自行车是否可通行以及拥挤度等信息(0号点空置，用于存放不定地点)
     */
    struct arcMessage arc[MAXPOINTNUM][MAXPOINTNUM];

    /**
     * @brief pointNum     地图中实际使用的点个数
     */
    int pointNum = 0;

    /**
     * @brief pointBuildNum 建筑编号
     */
    QList<int> pointBuildingNum;

    /**
     * @brief pointBuildingNumXiTuCheng 西土城建筑在pointBuildingNum中开始的编号。
     */
    int pointBuildingNumXiTuCheng = 0;

    /**
     * @brief pointNumShaHe 沙河点的个数。由于沙河先初始化，所以设该值作为分界
     */
    int pointNumShaHe = 0;

    /**
     * @brief arcNum 地图中实际使用的边数
     */
    int arcNum = 0;

    /**
     * @brief arcNumShaHe 沙河边的个数。由于沙河先初始化，所以设该值作为分界
     */
    int arcNumShaHe = 0;

    myGraph(package *pkg);

    void Init();
    void InitArc(int a, int b, QList<QString> line, QList<QString> peakP, QList<QString> peakV);
    double NormalDistribution(double A, double Mu, double Sigma, int x);
    double CalculateCongestion(QTime myTime, int a, int b);
    int string2Num(QString address);
    QString num2String(int num);
};

#endif // MYGRAPH_H
